数组做为参数传入Oracle存储过程操作数据库 | 您所在的位置:网站首页 › oracle 脚本传参数 › 数组做为参数传入Oracle存储过程操作数据库 |
数组做为参数传入Oracle存储过程操作数据库
数组里存储的是String、int、lang等基本数据类型或引用数据类型(不包括java bean)
一、在oracle中定义一个数组类型(TYPE) 代码如下: createorreplacetype msg_array astableofnumber; 意思是创建一个名称为msg_array,存放类型为整型的数组类型 二、在oracle中定义一个存储过程 代码如下: createorreplaceprocedure modifyage(m_array in msg_array) as begin for i in1..m_array.count loop update users set age=age+1where id=m_array(i); endloop; commit; exception whenothersthen rollback; end modifyage; 创建一个存储过程,传入的参数是上面定义的msg_array类型,操作内容为循环传入的数组,对表的age字段做加1操作。 三、JAVA代码如下 Connection conn = null; CallableStatement cstmt = null; try { Class.forName("oracle.jdbc.OracleDriver"); conn = DriverManager.getConnection( "jdbc:oracle:thin:@localhost:1521:orcl", "orcl_dev", "dev"); List list = new ArrayList(); list.add(30); list.add(31); list.add(32); list.add(33); ArrayDescriptor tabDesc = ArrayDescriptor.createDescriptor( "MSG_ARRAY", conn); ARRAY vArray = new ARRAY(tabDesc, conn, list.toArray()); cstmt = conn.prepareCall("call modifyage(?)"); cstmt.setArray(1, vArray); cstmt.execute(); cstmt.close(); conn.close(); } catch (Exception e) { e.printStackTrace(); } 首先定义Connection、CallableStatement2个变量,然后通过JDBC的方式得到Connection,然后定义要传给存储过程的数组。 映射 Oracle端数组 AS TABLE OF类型 通过ArrayDescriptor.createDescriptor("MSG_ARRAY",conn)定义数组描述方式。 在通过new ARRAY(tabDesc, conn, list.toArray()),把要传入的数组按批定的数组描述方式生成一个新的Oracle定义的数组。 调用存储过程,传入参数并执行。
数组里存储的是java bean
一、在oracle中定义一个对象类型(OBJECT) createorreplacetype userobj asobject( id number, username nvarchar2(20), age number, password nvarchar2(20) ) 意思是创建一个名称为userobj的对象类型,字符串的类型一定要写成nvarchar2,否则,传入数据库的字符串为null 二、在oracle中定义一个数组类型(TYPE) 代码如下: createorreplacetype obj_array astableof userobj; 意思是创建一个名称为obj_array,存放类型为userobj的数组类型 三、在oracle中定义一个存储过程 代码如下: createorreplaceprocedure saveObjArray ( avc_objArray in obj_array, rowcountoutnumber, msg outvarchar2 )as userinfo userobj; begin for i in avc_objArray.First()..avc_objArray.Last()loop userinfo := avc_objArray(i); insertinto users (id,name,password,age) values(userinfo.id,userinfo.username,userinfo.password,userinfo.age); endloop; rowcount:=sql%rowcount; commit; exception whenothersthen rowcount:=0; msg :=sqlerrm; rollback; end saveObjArray; 创建一个存储过程,传入的参数是上面定义的obj_array类型的数组,循环数组,分别插入数据库。返回受影响的行数和提式信息。 四、JAVA代码如下 Connection conn = null; CallableStatement cstmt = null; try{ Class.forName("oracle.jdbc.OracleDriver"); conn = DriverManager.getConnection( "jdbc:oracle:thin:@localhost:1521:orcl", "orcl_dev", "dev"); List userList = new ArrayList(); User user = new User(); user.setId(37); user.setUsername("dddddd"); user.setPassword("dddddd"); user.setAge(14); userList.add(user); StructDescriptor recDesc = StructDescriptor.createDescriptor("USEROBJ", conn); ArrayList pstruct = new ArrayList(); for(User u : userList){ Object[] objs = new Object[4]; objs[0] = u.getId(); objs[1] = u.getUsername(); objs[2] = u.getAge(); objs[3] = u.getPassword(); STRUCT struct = new STRUCT(recDesc, conn, objs); pstruct.add(struct); } ArrayDescriptor tabDesc = ArrayDescriptor.createDescriptor("OBJ_ARRAY", conn); ARRAY vArray = new ARRAY(tabDesc, conn, pstruct.toArray()); cstmt = conn.prepareCall("call saveObjArray(?,?,?)"); cstmt.setArray(1, vArray); cstmt.registerOutParameter(2, Types.INTEGER); cstmt.registerOutParameter(3, Types.VARCHAR); cstmt.execute(); System.out.println(cstmt.getString(2)); System.out.println(cstmt.getString(3)); cstmt.close(); conn.close(); }catch(Exception e){ e.printStackTrace(); } 首先定义Connection、CallableStatement2个变量,然后通过JDBC的方式得到Connection,然后定义要传给存储过程的数组。 映射 Oracle端对象 AS OBJECT类型 首先通过StructDescriptor.createDescriptor("USEROBJ",conn)定义对象描述方式。 然后,把java bean 的各个属性赋值给Object类型的数组,通过new STRUCT(recDesc, conn, objs)方法,把java bean按照对象描述方式描述成Oracle可以识别的对象。最后放到数组里。 映射 Oracle端数组 AS TABLE OF类型 通过ArrayDescriptor.createDescriptor("OBJ_ARRAY",conn)定义数组描述方式。 在通过new ARRAY(tabDesc, conn, pstruct.toArray()),把要传入的数组按批定的数组描述方式生成一个新的Oracle定义的数组。 调用存储过程,传入参数并执行。 好文要顶 关注我 收藏该文 Oracle-fans关注 - 0粉丝 - 5 +加关注 0 0 « 上一篇:发票摇奖数据汇总(数据行转列)» 下一篇:oracle输出多行多列数据 posted @ 2016-12-07 09:35 Oracle-fans 阅读(9643) 评论(0) 编辑 收藏 https://www.cnblogs.com/iyoume2008/p/6139925.html
|
CopyRight 2018-2019 实验室设备网 版权所有 |